<?php

/**
 * AdministratorsController
 * 
 * @author MF
 * @version 2.0
 */

require_once 'Zend/Controller/Action.php';

class Cms_AdministratorController extends Zend_Controller_Action {
	
	function init() {
		CmsAccess::restrictModule('administrators');
	}
	
	/**
	 * The default action - show the home page
	 */
	public function indexAction() {
		
	}

	
	public function dataAction() {
		
		$admin = MF_Main::getInstance()->Administrator;
		
		if (NULL !== $filter = $this->getRequest()->getParam('filter')) {
			$filter = $this->_helper->JsonEncoding($filter);
			$admin = $admin->search();
			$admin->login = $filter;
			$admin->name = $filter;
			$admin->rule = 'OR';
			$admin->Make();
		}
		
		$aList = array();
		for ($a=0;$a<$admin->length();$a++) {
			$curAdmin = $admin->item($a);
			
			// Выбираем группы к которым привязан администратор
			$group_list = array();
			$get_groups = $curAdmin->groupList();
			for ($g=0;$g<$get_groups->length();$g++) {
				array_push($group_list,$get_groups->item($g)->name);
			}
			
			array_push($aList,
				array(
					array("admin_row_num",array('nn' => ($a+1))),
					array("admin_login",array('login' => $curAdmin->login)),
					array("admin_name",array('name' => $curAdmin->name)),
					array('admin_group',array('id' => $curAdmin->administrator_id,'list' => $group_list)),
					array("admin_modul",array('id' => $curAdmin->administrator_id)),
					array("admin_edit",array('id' => $curAdmin->administrator_id)),
					array("admin_pass",array('id' => $curAdmin->administrator_id)),
					array("admin_block",array('id' => $curAdmin->administrator_id,'s' => $curAdmin->is_blocked)),
					array("admin_delete",array('id' => $curAdmin->administrator_id))
				));
		}
		
		
		$this->view->data = $aList; 
		$this->renderScript('json.phtml');
	}
	
	
	public function blockedAction() {
		
		if (NULL === $id = $this->getRequest()->getParam('id')) {
			throw new Zend_Controller_Action_Exception('Required param "Id"', 404);
		}
		
		$admin = MF_Main::getInstance()->Administrator->getById($id);
		$admin->is_blocked = $admin->is_blocked==0 ? 1 : 0;
		
		$this->view->data = array('s' => $admin->is_blocked);
		$this->renderScript('json.phtml');
	}
	
	public function deleteAction() {
		
		if (NULL === $id = $this->getRequest()->getParam('id')) {
			throw new Zend_Controller_Action_Exception('Required param "Id"', 404);
		}
		
		MF_Main::getInstance()->Administrator->getById($id)->delete();
		
		$this->view->data = array('s' => 1);
		$this->renderScript('json.phtml');
	}
	
	
	public function addAction() {
		$this->view->type = $this->getRequest()->getParam('type');
		
		if ($this->view->type=='save') {
			$post_data = $this->_request->getPost();
			$resp = array();
			
			$adminObj = MF_Main::getInstance()->Administrator;
			
			$post_data = $this->_helper->JsonEncoding($post_data);
			
			/** Следующий блок для дебага
			 * 
			 *  Необходимо проверить логин, проверки должны быть следующие:
			 *  1. Проверка длины логина, должен быть от 6 до 20 символов
			 *  2. Проверка регулярным выражением на содежрание запрещенных символов, должен состояить из a-zA-Z0-9 
			 *  3. Проверка на уникальность
			**/
			
			$post_data['login'] = trim($post_data['login']);
			if (strlen($post_data['login'])<6) {
				$resp['login'] = '<strong>Логин слишком короткий.</strong> Должен быть не менее 6 символов.';
			} elseif (strlen($post_data['login'])>20) {
				$resp['login'] = '<strong>Логин слишком длинный.</strong> Не может превышать 20 символов.'.$post_data['login'];
			} elseif (ereg('[^a-zA-Z0-9]',$post_data['login'])) {
				$resp['login'] = '<strong>Логин содержит запрещенные символы.</strong> Убедитесь, что логин состоит только из символов латинского алфавита и цифр.';
			} else {
				$checkLogin = $adminObj->search();
				$checkLogin->login = $post_data['login'];
				$checkLogin->Make();
				if ($checkLogin->length()!=0) {
					$resp['login'] = '<strong>Логин не уникален.</strong> Этот логин уже используется другим администратором.';
				}
			}
			
			
			
			/**
			 * Проверка пароля. Возможные ошибки:
			 * 1. Пароль слишком длинный
			 * 2. Пароль слишком короткий
			 * 
			 * Ошибки для вывода на экран:
			 * <strong>Пароль слишком короткий.</strong> Не может содержать менее 6 символов, так как это небезопасно.
			 * <strong>Пароль слишком длинный.</strong> Длина пароля не может превышать 30 символов.
			 */
//			$resp['pass'] = '<strong>Пароль слишком длинный.</strong> Длина пароля не может превышать 30 символов.';
			if (strlen($post_data['pass'])<6) {
				$resp['pass'] = '<strong>Пароль слишком короткий.</strong> Не может содержать менее 6 символов, так как это небезопасно.';
			} elseif (strlen($post_data['pass'])>30) {
				$resp['pass'] = '<strong>Пароль слишком длинный.</strong> Длина пароля не может превышать 30 символов.';
			}
			
			
			/**
			 * Проверка подтверждения пароля. Возможные ошибки:
			 * 1. Пароль не подтвержден
			 * 
			 * Ошибки для вывода на экран:
			 * <strong>Пароли не совпадают.</strong> Убедитесь, что введенные пароли совпадают. 
			 **/
			if ($post_data['pass']!==$post_data['confirm']) {
				$resp['confirm'] = '<strong>Пароли не совпадают.</strong> Убедитесь, что введенные пароли совпадают.';
			}
			
			if (count($resp)==0) {
				$newAdmin = $adminObj->add();
				$newAdmin->login = $post_data['login'];
				$newAdmin->password = $post_data['pass'];
				$newAdmin->name = $post_data['name'];
				$newAdmin->summary = $post_data['summary'];
				$resp['ok'] = '1';
			} else {
				$resp['ok'] = '0';
			} 
			
			
			
			$this->view->data = $resp;
			$this->renderScript('json.phtml');
			
		} elseif ($this->view->type=='css') {
			$this->_response->clearHeaders();
			$this->_response->setHeader('Content-type','text/css');
		}
	}
	
	
	public function passAction() {
		
		if (NULL === $id = $this->getRequest()->getParam('id')) {
			throw new Zend_Controller_Action_Exception('Required param "Id"', 404);
		}
		
		$this->view->type = $this->getRequest()->getParam('type');
		
		$editAdmin = MF_Main::getInstance()->Administrator->getById($id);
		$this->view->administrator_id = $editAdmin->administrator_id;
		$this->view->login = $editAdmin->login;
		$this->view->name = $editAdmin->name;
		
		
		
		if ($this->view->type=='save') {
			$post_data = $this->_request->getPost();
			$resp = array();
			
			/**
			 * Проверка пароля. Возможные ошибки:
			 * 1. Пароль слишком длинный
			 * 2. Пароль слишком короткий
			 * 
			 * Ошибки для вывода на экран:
			 * <strong>Пароль слишком короткий.</strong> Не может содержать менее 6 символов, так как это небезопасно.
			 * <strong>Пароль слишком длинный.</strong> Длина пароля не может превышать 30 символов.
			 */
			
			if (strlen($post_data['pass'])<6) {
				$resp['pass'] = '<strong>Пароль слишком короткий.</strong> Не может содержать менее 6 символов, так как это небезопасно.';
			} elseif (strlen($post_data['pass'])>30) {
				$resp['pass'] = '<strong>Пароль слишком длинный.</strong> Длина пароля не может превышать 30 символов.';
			}
			
			/**
			 * Проверка подтверждения пароля. Возможные ошибки:
			 * 1. Пароль не подтвержден
			 * 
			 * Ошибки для вывода на экран:
			 * <strong>Пароли не совпадают.</strong> Убедитесь, что введенные пароли совпадают. 
			 **/
			if ($post_data['pass']!==$post_data['confirm']) {
				$resp['confirm'] = '<strong>Пароли не совпадают.</strong> Убедитесь, что введенные пароли совпадают.';
			}
			
			
			if (count($resp)==0) {
				$editAdmin->password = $post_data['pass'];
				
				$resp['ok'] = '1';
			} else {
				$resp['ok'] = '0';
			} 
			
			$this->view->data = $resp;
			$this->renderScript('json.phtml');
			
		} elseif ($this->view->type=='css') {
			$this->_response->clearHeaders();
			$this->_response->setHeader('Content-type','text/css');
		}
	}
	
	public function editAction() {
		
		if (NULL === $id = $this->getRequest()->getParam('id')) {
			throw new Zend_Controller_Action_Exception('Required param "Id"', 404);
		}
		
		$this->view->type = $this->getRequest()->getParam('type');
		
		$editAdmin = MF_Main::getInstance()->Administrator->getById($id);
		$this->view->administrator_id = $editAdmin->administrator_id;
		$this->view->login = $editAdmin->login;
		$this->view->name = $editAdmin->name;
		$this->view->summary = $editAdmin->summary;
		
		
		if ($this->view->type=='save') {
			$post_data = $this->_request->getPost();
			$post_data = $this->_helper->JsonEncoding($post_data);
			
			$resp = array();
			
			
			$editAdmin->name = $post_data['name'];
			$editAdmin->summary = $post_data['summary'];
			
			
			$resp['ok'] = '1'; 
			
			$this->view->data = $resp;
			$this->renderScript('json.phtml');
			
		} elseif ($this->view->type=='css') {
			$this->_response->clearHeaders();
			$this->_response->setHeader('Content-type','text/css');
		}
	}
	
	public function groupsAction() {
		if (NULL === $id = $this->getRequest()->getParam('id')) {
			throw new Zend_Controller_Action_Exception('Required param "Id"', 404);
		}
		
		$this->view->type = $this->getRequest()->getParam('type');
		
		$main = MF_Main::getInstance();
		
		$editAdmin = $main->Administrator->getById($id);
		$this->view->administrator_id = $editAdmin->administrator_id;
		$this->view->login = $editAdmin->login;
		$this->view->name = $editAdmin->name;
		
		
		$get_groups = $main->AdminGroup;
		
		$groupsList = array();
		for ($g=0;$g<$get_groups->length();$g++) {
			array_push($groupsList,
				array(
					$get_groups->item($g)->group_id,
					$get_groups->item($g)->name,
					$get_groups->item($g)->checkAdmin($editAdmin)
				));
		}
		
		
		$this->view->groupsList = $groupsList;
		
		if ($this->view->type=='save') {
			$post_data = $this->_request->getPost();
			
			for ($g=0;$g<$get_groups->length();$g++) {
				$editAdmin->unlinkGroup($get_groups->item($g));
			}
			
			for ($p=0;$p<count($post_data['groupid']);$p++) {
				$editAdmin->linkGroup($post_data['groupid'][$p]);
			}
			
			$resp['ok'] = '1';
			
			$this->view->data = $resp;
			$this->renderScript('json.phtml');
			
		}
	}
	
	public function modulesAction() {
		if (NULL === $id = $this->getRequest()->getParam('id')) {
			throw new Zend_Controller_Action_Exception('Required param "Id"', 404);
		}
		
		$this->view->type = $this->getRequest()->getParam('type');
		
		$editAdmin = MF_Main::getInstance()->Administrator->getById($id);
		$this->view->administrator_id = $editAdmin->administrator_id;
		$this->view->login = $editAdmin->login;
		$this->view->name = $editAdmin->name;
		
		$modulesList = array();
		$modules = CmsModule::getInstance();
		for ($m=0;$m<$modules->length();$m++) {
			if ($modules->item($m)->use=='1') {
				array_push($modulesList,
					array(
						$modules->item($m)->key,
						$modules->item($m)->name,
						$editAdmin->checkModule($modules->item($m)->key)
					));
			}
		}
		$this->view->modulesList = $modulesList;
			
		if ($this->view->type=='save') {
			$post_data = $this->_request->getPost();

			for ($m=0;$m<$modules->length();$m++) {
				$editAdmin->unlinkModule($modules->item($m)->key);
			}
			
			for ($p=0;$p<count($post_data['module']);$p++) {
				$editAdmin->linkModule($post_data['module'][$p]);
			}
			
			$resp['ok'] = '1';
			
			$this->view->data = $resp;
			$this->renderScript('json.phtml');
			
		}
	}
	
	public function menuAction() {
		if (NULL === $id = $this->getRequest()->getParam('id')) {
			throw new Zend_Controller_Action_Exception('Required param "Id"', 404);
		}
		
		$main = MF_Main::getInstance();
		
		$menu = $main->Menu->getPointById($id);
		
		$this->view->menu_id = $menu->menu_id;
		$this->view->name = $menu->name;
		
		$adminsList = array();
		$get_admins = $main->Administrator;
		for ($a=0;$a<$get_admins->length();$a++) {
			array_push($adminsList,
				array(
					$get_admins->item($a)->administrator_id,
					"{$get_admins->item($a)->name} ({$get_admins->item($a)->login})",
					$get_admins->item($a)->checkMenu($menu)
				));
		}
		
		$this->view->adminsList = $adminsList;
		
		if ($this->getRequest()->getParam('type')=='save') {
			$post_data = $this->_request->getPost();
			
			
			$this->menuLinker($post_data['adminid'],$menu,$post_data['recursive']=='1' ? true : false);
			
			
			
			$resp['ok'] = '1';
			
			$this->view->data = $resp;
			$this->renderScript('json.phtml');
			
		}
		
	}
	
	/**
	 * System function to attach priveleges to menu point
	 *
	 * @param array $checked_admins
	 * @param MenuItem $menu
	 * @param boolean $recursion
	 */
	private function menuLinker($checked_admins,$menu,$recursion) {
		
		$get_admins = MF_Main::getInstance()->Administrator;
		
		for ($a=0;$a<$get_admins->length();$a++) {
			$get_admins->item($a)->unlinkMenu($menu);
		}
		
		for ($p=0;$p<count($checked_admins);$p++) {
			$get_admins->getById($checked_admins[$p])->linkMenu($menu);
		}
		
		if ($recursion) {
			for ($m=0;$m<$menu->length();$m++) {
				$this->menuLinker($checked_admins,$menu->item($m),$recursion);
			}
		}
		
	}
	
	
}